package cn.edu.cuit.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author fhzheng
 * <h1> 所有用户登录检测控制器 </h1>
 * <li> 1 首用户登录则加入登录列表
 * <li> 2 非首用户查看列表中是否已经登录 
 * <li> 3 如果用户存在未登录则加入登录列表
 * <li> 4 输出所有登录的用户
 * 
 */
public class LoginAllServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	
	private ArrayList<String> users = null;	// 用户列表
	private ServletContext context  =null;	// 上下文对象
	
	public LoginAllServlet() {
		super();
	}
	public void destroy() {
		super.destroy();
	}

	/**
	 * <li> 仅调用doPost方法来处理，具体见doPost方法
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * <li> 控制器核心动作
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 中文乱码处理
		request.setCharacterEncoding("utf-8");
		// 在项目启动第一次时创建，该项目只创建一次，唯一的，获取上下文对象
        context = this.getServletContext(); 
        boolean flag = false;	// 用户登录标志
        String url="../listener/login.jsp";
        
        // 获取用户参数
        String username=request.getParameter("username");
        
        //获取用户列表,第一次获取时候为空，直接从上下文对象中获取   
        users =(ArrayList<String>)context.getAttribute("users");
        //第一个用户登录时，列表肯定为空
        if(users.isEmpty()){
            users = new ArrayList<String>();		// 初始化列表     
            users.add(username); 					// 添加一个用户到列表中  
            // 以下动作将触发监听动作
            context.setAttribute("users", users);   // 将第一个用户的名字保存到ServletContext对象中   
            System.out.println("--------第一个用户登录------");
            
        //非第一个用户登录   
        }else{
        	// 遍历，看是否已经存在该用户
            for(String user : users){
                //如果该用户已经登录,请求error.jsp不让其再登录
                if(username.equals(user)){
                    url = "../listener/error.jsp";   
                    System.out.println("--------该用户重复登录------");
                    flag = true;
                    break;   
                }
            }
            if (!flag) {	// 用户已经存在，标识未登录 
                //如果该用户没登录,就将该用户的名字保存到ServletContext对象中
                System.out.println("--------非重复登录------");
                users.add(username); 
			} 
        }
        // 在控制台输出已经登录的用户
        int i = 0;
        for (String user : users) {
			System.out.println("==========" + i+1+" : " + user +"==========");
			i++;
		}

        // 响应对象完成重定向，这个动作会让客户端再次发请求来完成
        response.sendRedirect(url); 
	}

	public void init() throws ServletException {
	}

}
